#include "threadpool.h"
#include <unistd.h>
//未完成
namespace daniel
{

    ThreadPool::ThreadPool(uint32_t threadNum,uint32_t maxTaskNum):m_threadNum(threadNum),m_tasks(maxTaskNum)
    {
        //创建线程,调度线程使用manageFunc初始化,删除管理线程
        // m_manageThread=std::thread(manageFunc);
        //工作线程使用workFunc初始化
        m_threads.reserve(m_threadNum);
        for (size_t i = 0; i <m_threadNum ; i++)
        {
            m_threads.emplace_back(std::thread(std::bind(&ThreadPool::workFunc,this)));
        }
    }
    //线程调度函数，供管理者线程调用
    void ThreadPool::manageFunc()
    {
        //隔一段时间调度即可，不需要一直调度
        /*
        *调度方法：
        *当任务队列的任务多于当前线程1/3时，多开启1/3数量的线程,最多线程数不得高于maxThrNum；
        *当空闲线程数多于1/3时，销毁1/3线程，最少线程数不得低于minThrNum;
        */
    }
    //工作线程调用函数
    void ThreadPool::workFunc()
    {
        //从任务队列中取任务，并执行，互斥和条件变量由任务队列保证
        while(1){
            if (m_tasks.isEmpty()&&m_needStop){
                break;
            }
            std::function<void()> task=m_tasks.getTask();
            task();
        }
        //如何跳出while(1)???
    }
    //添加工作任务的接口,并发正确性由队列保证
    void ThreadPool::addTask(std::function<void()> Func)
    {
        //并发正确性由任务队列保证
        m_tasks.addTask(Func);
        return;
    }
    /*停止线程池运行，
        1.停止任务队列的添加任务功能；
        2.执行完成所有的任务;
        3.回收所有的占用的资源，主要是线程对象的detach；
    */
    void ThreadPool::stop()
    {
        m_tasks.stop();
        //判断任务队列是否为空
        m_needStop=true;
        while(1){
            if (m_tasks.isEmpty()){
                break;
            }
        }
        //等待所有线程执行完成队列的任务
        for(size_t i=0;i<m_threads.size();i++){
            m_threads[i].join();
        }
    }
}